// 集合工具类

/**
 * 遍历树，生成父节点MAP  子 找 父
 * @param arr 
 * @param key 
 * @param children 
 */
export function genParentMap(arr:Array<any>,key:string='key', children='children'){
    // 初始化一个空的 Map 用于存储父子节点关系
    const parentMap = new Map();
    // 如果树为空，直接返回空的 Map
    if (!arr) {
        return parentMap;
    }
    // 初始化一个队列，用于存储待处理的节点及其父节点的 id
    const queue = [{ list: arr, parentKey: null }];

    // 当队列不为空时，继续处理节点
    while (queue.length > 0) {
        // 从队列中取出一个节点及其父节点的 id
        let item = queue.shift();
        item?.list?.map((val:any)=>{
            if(item?.parentKey){
                parentMap.set(val[key],item.parentKey)
            }
            
            // 如果当前节点有子节点，将子节点及其父节点的 key 加入队列
            if(val[children] && val[children].length>0){
                queue.push({ list: val[children], parentKey: val[key] });
            }
        })
    }

    return parentMap;
}

/**
 * 遍历树，生成父节点MAP  父 找 子
 * @param arr 
 * @param key 
 * @param children 
 */
export function genChildrenMap(arr:Array<any>,key:string='key', children='children'){
    // 初始化一个空的 Map 用于存储父子节点关系
    const childrenMap = new Map();
    // 如果树为空，直接返回空的 Map
    if (!arr) {
        return childrenMap;
    }
    // 初始化一个队列，用于存储待处理的节点及其父节点的 id
    const queue = [{ children: arr, key: null, value: arr }];

    // 当队列不为空时，继续处理节点
    while (queue.length > 0) {
        // 从队列中取出一个节点及其父节点的 id
        let item = queue.shift();
        if(item?.key){
            childrenMap.set(item.key,item.value)
        }
        item?.children?.map((val:any)=>{            
            // 如果当前节点有子节点，将子节点及其父节点的 key 加入队列
            if(val[children] && val[children].length>0){
                queue.push({ children: val[children], key: val[key],value: val });
            }
        })
    }

    return childrenMap;
}
